#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 201
#include<queue>
int ecnt,head[maxn],dis[maxn],N,M,tmp,P[maxn],L[maxn],X[maxn],bh,jg,T[maxn][maxn],V[maxn][maxn],minn=0x3f3f3f3f,vis[maxn],d;
using namespace std;
struct edge
{
    int u,v,w,next;
}E[maxn*maxn];
void add(int u,int v,int w)
{
    E[++ecnt].u=u;
    E[ecnt].v=v;
    E[ecnt].w=w;
    E[ecnt].next=head[u];
    head[u]=ecnt;
}
bool judge(int x)
{
    if(L[x]>d+M||L[x]<d) return 0;
    return 1;
}
void spfa()
{
    memset(dis,0x3f3f3f3f,sizeof(dis));
    vis[1]=1;
    queue<int> q;
    q.push(1);
    dis[1]=0;
    L[0]=L[1];
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i;i=E[i].next)
        {
            int v=E[i].v;
            if(dis[v]>dis[u]+E[i].w&&judge(v))
            {
                dis[v]=dis[u]+E[i].w;
                if(!vis[v])
                {
                    q.push(v);
                    vis[v]=1;
                }
            }
        }
    }
    minn=min(dis[0],minn);
}
int main()
{
    scanf("%d%d",&M,&N);
    tmp=N;
    for(int i=1;i<=N;++i)
    {
        scanf("%d%d%d",&P[i],&L[i],&X[i]);
        for(int j=1;j<=X[i];++j)
        {
            scanf("%d%d",&bh,&jg);
            T[i][j]=bh;
            V[i][j]=jg;
        }
    }
    for(int i=1;i<=tmp;++i)
    {
        for(int j=1;j<=X[i];++j)
            add(i,T[i][j],V[i][j]);
        add(i,0,P[i]);
    }
    memset(dis,0x3f3f3f3f,sizeof(dis));
    for(d=L[1]-M;d<=L[1];++d) spfa();
    printf("%d\n",minn);
    return 0;
}
